#ifndef _GENERAL_VISITOR_
#define _GENERAL_VISITOR_

#include "tree/ArrayAccess.h"
#include "tree/BinaryOperation.h"
#include "tree/ConstantValue.h"
#include "tree/FieldAccess.h"
#include "tree/UnaryOperation.h"
#include "tree/Variable.h"

#include "tree/ClassDefinition.h"
#include "tree/FunctionDefinition.h"
#include "tree/MethodDefinition.h"

#include "tree/Assign.h"
#include "tree/EmptyStatement.h"
#include "tree/ForLoop.h"
#include "tree/IfStatement.h"
#include "tree/NewExpression.h"
#include "tree/ReturnStatement.h"
#include "tree/StatementList.h"
#include "tree/VarDeclaration.h"
#include "tree/WhileLoop.h"

#include "tree/FunctionCall.h"
#include "tree/MethodCall.h"

class GeneralVisitor
{
public:
    virtual ~GeneralVisitor() {}
    virtual void Visit(ArrayAccess* iNode) = 0;
    virtual void Visit(BinaryOperation* iNode) = 0;
    virtual void Visit(ConstantValue* iNode) = 0;
    virtual void Visit(FieldAccess* iNode) = 0;
    virtual void Visit(UnaryOperation* iNode) = 0;
    virtual void Visit(Variable* iNode) = 0;
    virtual void Visit(Assign* iNode) = 0;
    virtual void Visit(EmptyStatement* iNode) = 0;
    virtual void Visit(ForLoop* iNode) = 0;
    virtual void Visit(IfStatement* iNode) = 0;
    virtual void Visit(NewExpression* iNode) = 0;
    virtual void Visit(ReturnStatement* iNode) = 0;
    virtual void Visit(StatementList* iNode) = 0;
    virtual void Visit(VarDeclaration* iNode) = 0;
    virtual void Visit(WhileLoop* iNode) = 0;
    virtual void Visit(FunctionCall* iNode) = 0;
    virtual void Visit(MethodCall* iNode) = 0;
    virtual void Visit(ClassDefinition* iNode) = 0;
    virtual void Visit(FunctionDefinition* iNode) = 0;
    virtual void Visit(MethodDefinition* iNode) = 0;
};

#endif
